home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / util / cli / sploinerwos.lha / source.lha / repair.c < prev    next >
C/C++ Source or Header  |  1995-09-26  |  1KB  |  53 lines

  1. #include "common.h"
  2.  
  3. void repair(int argc, char *argv[])
  4. {
  5.   FILE *fp;
  6.  
  7.   size_t maxfilesize=0, filesize, i;
  8.   char *magic = (char *) malloc(maxfilesize);/*allocating 0 bytes can't fail*/
  9.  
  10.   for(;(argc-- > 0) && strcmp(*argv,"as") ; argv++)
  11.     {
  12.       if ((fp = fopen(*argv,"rb")) == NULL)
  13.     {
  14.       printf("Can't open %s\n",*argv);
  15.       usage_repair();
  16.     }
  17.       else
  18.     {
  19.       if ((filesize=FileSize(fp)) > maxfilesize)
  20.         {
  21.           magic = (char *) realloc(magic,filesize);
  22.           if(magic == NULL)
  23.         {
  24.           printf("Error: Failed to allocate %lu bytes for buffer.\n"
  25.              ,(long unsigned int) filesize);
  26.           fclose(fp);
  27.           exit(1);
  28.         }
  29.           memset((&magic[maxfilesize]), 0, filesize-maxfilesize);
  30.           maxfilesize = filesize;
  31.         }
  32.       fprintf(stderr, "Reading %s\n",*argv);
  33.       for(i=0 ; i < filesize ; i++)
  34.         magic[i] = magic[i] ^ getc(fp);
  35.       fclose(fp);
  36.     }
  37.     }
  38.   if ((argc < 0) || strcmp(*argv,"as")!=0) usage_repair();
  39.   if ((fp = fopen(*++argv,"wb")) == NULL)
  40.     {
  41.       printf("Can't open %s\n",*argv);
  42.       usage_repair();
  43.     }
  44.   else
  45.     {
  46.       fprintf(stderr, "Writing %s\n",*argv);
  47.       if(fwrite(magic, 1, maxfilesize, fp) != maxfilesize)
  48.     printf("Error: Write to <%s> failed.\n",*argv);
  49.       fclose(fp);
  50.       free(magic);
  51.     }
  52. }
  53.